package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
)

type UserInfo struct {
	//结构体想要从外面被别人通过反射取到里面的字段，字段名首字母必须大写
	Username string `form:"username" json:"username"` //tag：让该字段在别人来查找该字段时，能够对应起来
	Password string `form:"password" json:"password"`
}

func main() {
	r := gin.Default()

	r.LoadHTMLFiles("web14_ShouldBind/index.html")

	r.GET("/user", func(context *gin.Context) {
		username := context.Query("username")
		password := context.Query("password")
		u := UserInfo{
			Username: username,
			Password: password,
		}
		fmt.Printf("%#v\n", u)
		context.JSON(http.StatusOK, gin.H{
			"message": "OK",
		})
	})

	r.GET("/index", func(context *gin.Context) {
		context.HTML(http.StatusOK, "index.html", nil)
	})

	r.POST("/form", func(context *gin.Context) {
		var u UserInfo //声明一个UserInfo类型的变量
		/*
			.ShouldBind()强大的功能，它能够基于请求自动提取JSON、form表单和QueryString类型的数据，并把值绑定到指定的结构体对象。
		*/
		err := context.ShouldBind(&u)
		if err != nil {
			context.JSON(http.StatusOK, gin.H{
				"error": err.Error(),
			})
		} else {
			fmt.Printf("%#v\n", u)
			context.JSON(http.StatusOK, gin.H{
				"message": "OK",
			})
		}
	})

	r.POST("/json", func(context *gin.Context) {
		var u UserInfo //声明一个UserInfo类型的变量
		err := context.ShouldBind(&u)
		if err != nil {
			context.JSON(http.StatusOK, gin.H{
				"error": err.Error(),
			})
		} else {
			fmt.Printf("%#v\n", u)
			context.JSON(http.StatusOK, gin.H{
				"message": "OK",
			})
		}
	})

	r.Run(":9090")
}
